/*********************************
 * Themes, rules, and i18n support
 * Locale: Chinese; 中文
 *********************************/
(function (factory) {
    if (typeof define === 'function') {
        define(function (require, exports, module) {
            var $ = require('jquery');
            $._VALIDATOR_URI = module.uri;
            require('../src/jquery.validator')($);
            factory($);
        });
    } else {
        factory(jQuery);
    }
}(function ($) {
    /* Global configuration
     */
    $.validator.config({
        stopOnError: true,
        theme: 'default',
        defaultMsg: "{0}格式不正确",
        loadingMsg: "正在验证...",
        timely: true,
        msgWrapper: "div",
        display: function (el) {
            return el.getAttribute('placeholder') || '';
        },
        valid: function (form) {
            var me = this;
            me.holdSubmit();
            form.submit();
        },
        // Custom rules
        rules: {
            digits: [/^\d+$/, "请输入数字"]
            , letters: [/^[a-z]+$/i, "{0}只能输入字母"]
            , tel: [/^(?:(?:0\d{2,3}[\- ]?[1-9]\d{6,7})|(?:[48]00[\- ]?[1-9]\d{6}))$/, "电话格式不正确"]
            , mobile: [/^1[3-9]\d{9}$/, "手机号格式不正确"]
            , email: [/^[\w\+\-]+(\.[\w\+\-]+)*@[a-z\d\-]+(\.[a-z\d\-]+)*\.([a-z]{2,4})$/i, "邮箱格式不正确"]
            , qq: [/^[1-9]\d{4,}$/, "QQ号格式不正确"]
            , date: [/^\d{4}-\d{1,2}-\d{1,2}$/, "请输入正确的日期,例:yyyy-mm-dd"]
            , time: [/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/, "请输入正确的时间,例:14:30或14:30:00"]
            , ID_card: [/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[A-Z])$/, "请输入正确的身份证号码"]
            , url: [/^(https?|ftp):\/\/[^\s]+$/i, "网址格式不正确"]
            , postcode: [/^[1-9]\d{5}$/, "邮政编码格式不正确"]
            , chinese: [/^[\u0391-\uFFE5]+$/, "请输入中文"]
            , username: [/^\w{3,12}$/, "请输入3-12位数字、字母、下划线"]
            , password: [/^[0-9a-zA-Z]{6,16}$/, "密码由6-16位数字、字母组成"]
            , accept: function (element, params) {
                if (!params)
                    return true;
                var ext = params[0];
                return (ext === '*') ||
                        (new RegExp(".(?:" + (ext || "png|jpg|jpeg|gif") + ")$", "i")).test(element.value) ||
                        this.renderMsg("只接受{1}后缀", ext.replace('|', ','));
            },
            decimal: function (element, params) {
                var regexp = "^\\d+(?:\\.\\d{1,2})?$";
                if (params) {
                    if (params[0][0] == "0") {
                        regexp = "^\\d+(?:\\.\\d{1" + params[0].substring(1) + "})?$";
                    } else {
                        regexp = "^\\d+\\.\\d{" + params[0] + "}$";
                    }
                }               
                return new RegExp(regexp).test(element.value);
            }

        }
    });

    /* Default error messages
     */
    $.validator.config({
        messages: {
            required: "{0}不能为空",
            remote: "{0}已被使用",
            integer: {
                '*': "请输入整数",
                '+': "请输入正整数",
                '+0': "请输入正整数或0",
                '-': "请输入负整数",
                '-0': "请输入负整数或0"
            },
            match: {
                eq: "{0}与{1}不一致",
                neq: "{0}与{1}不能相同",
                lt: "{0}必须小于{1}",
                gt: "{0}必须大于{1}",
                lte: "{0}必须小于或等于{1}",
                gte: "{0}必须大于或等于{1}"
            },
            range: {
                rg: "请输入{1}到{2}的数",
                gte: "请输入大于或等于{1}的数",
                lte: "请输入小于或等于{1}的数"
            },
            checked: {
                eq: "请选择{1}项",
                rg: "请选择{1}到{2}项",
                gte: "请至少选择{1}项",
                lte: "请最多选择{1}项"
            },
            length: {
                eq: "请输入{1}个字符",
                rg: "请输入{1}到{2}个字符",
                gte: "请至少输入{1}个字符",
                lte: "请最多输入{1}个字符",
                eq_2: "",
                rg_2: "",
                gte_2: "",
                lte_2: ""
            }
        }
    });

    /* Themes
     */
    var TPL_ARROW = '<span class="n-arrow"><b>◆</b><i>◆</i></span>';
    $.validator.setTheme({
        'simple_right': {
            formClass: 'n-simple',
            msgClass: 'n-right'
        },
        'simple_bottom': {
            formClass: 'n-simple',
            msgClass: 'n-bottom'
        },
        'yellow_top': {
            formClass: 'n-yellow',
            msgClass: 'n-top',
            msgArrow: TPL_ARROW
        },
        'yellow_right': {
            formClass: 'n-yellow',
            msgClass: 'n-right',
            msgArrow: TPL_ARROW
        },
        'yellow_right_effect': {
            formClass: 'n-yellow',
            msgClass: 'n-right',
            msgArrow: TPL_ARROW,
            msgShow: function ($msgbox, type) {
                var $el = $msgbox.children();
                if ($el.is(':animated'))
                    return;
                if (type === 'error') {
                    $el.css({
                        left: '20px',
                        opacity: 0
                    }).delay(100).show().stop().animate({
                        left: '-4px',
                        opacity: 1
                    }, 150).animate({
                        left: '3px'
                    }, 80).animate({
                        left: 0
                    }, 80);
                } else {
                    $el.css({
                        left: 0,
                        opacity: 1
                    }).fadeIn(200);
                }
            },
            msgHide: function ($msgbox, type) {
                var $el = $msgbox.children();
                $el.stop().delay(100).show().animate({
                    left: '20px',
                    opacity: 0
                }, 300, function () {
                    $msgbox.hide();
                });
            }
        }
    });
}));